/**
 ******************************************************************************
 * @file           : bsp_mpu6050.h
 * @brief          : MPU6050 Six-Axis Sensor Driver Header File (STM32H7xx)
 ******************************************************************************
 * @attention
 *
 * MPU6050六轴传感器驱动程序头文件
 * 3轴加速度计 + 3轴陀螺仪
 *
 ******************************************************************************
 */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __BSP_MPU6050_H
#define __BSP_MPU6050_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include <stdbool.h>

/* Exported types ------------------------------------------------------------*/

/**
 * @brief MPU6050错误码枚举
 */
typedef enum
{
    MPU6050_OK = 0,                 /*!< 操作成功 */
    MPU6050_ERROR = -1,             /*!< 操作失败 */
    MPU6050_ERROR_PARAM = -2,       /*!< 参数错误 */
    MPU6050_ERROR_TIMEOUT = -3,     /*!< 超时 */
    MPU6050_ERROR_NOT_FOUND = -4,   /*!< 设备未找到 */
} MPU6050_Error_e;

/**
 * @brief MPU6050数据结构体
 */
typedef struct
{
    int16_t accel_x;        /*!< X轴加速度（原始值） */
    int16_t accel_y;        /*!< Y轴加速度 */
    int16_t accel_z;        /*!< Z轴加速度 */
    int16_t gyro_x;         /*!< X轴角速度（原始值） */
    int16_t gyro_y;         /*!< Y轴角速度 */
    int16_t gyro_z;         /*!< Z轴角速度 */
    int16_t temperature;    /*!< 温度（原始值） */
} MPU6050_Data_t;

/**
 * @brief MPU6050物理值结构体
 */
typedef struct
{
    float accel_x;          /*!< X轴加速度(g) */
    float accel_y;          /*!< Y轴加速度(g) */
    float accel_z;          /*!< Z轴加速度(g) */
    float gyro_x;           /*!< X轴角速度(°/s) */
    float gyro_y;           /*!< Y轴角速度(°/s) */
    float gyro_z;           /*!< Z轴角速度(°/s) */
    float temperature;      /*!< 温度(°C) */
} MPU6050_PhysicalData_t;

/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported variables --------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/

/* 初始化和检测 */
MPU6050_Error_e mpu6050_init(void);
bool mpu6050_test_connection(void);
uint8_t mpu6050_read_id(void);

/* 数据读取 */
MPU6050_Error_e mpu6050_read_raw_data(MPU6050_Data_t *data);
MPU6050_Error_e mpu6050_read_physical_data(MPU6050_PhysicalData_t *data);
MPU6050_Error_e mpu6050_read_temperature(float *temp);

/* 配置函数 */
MPU6050_Error_e mpu6050_set_accel_range(uint8_t range);
MPU6050_Error_e mpu6050_set_gyro_range(uint16_t range);
MPU6050_Error_e mpu6050_calibrate(void);

#ifdef __cplusplus
}
#endif

#endif /* __BSP_MPU6050_H */
